﻿A:简单模拟
https://ac.nowcoder.com/acm/contest/98241/A

AC:
#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n, a, b, c;
    cin >> n >> a >> b >> c;

    int count = 0;
    int end = n;

    while (end > 0)
    {
        if (end >= a)
        {
            end -= a;
            count++;
        }
        else if (end < a && end >= b)
        {
            end -= b;
            count++;
        }
        else if (end < a && end < b && end >= c)
        {
            end -= c;
            count++;
        }
        else if (end < a && end < b && end < c)
        {
            break;
        }
    }
    cout << count;
    return 0;
}



B.贪心（未AC）

https ://ac.nowcoder.com/acm/contest/98241/B
——————————————————————————————————————————————————————————————————————————————————————
题目描述：

Cidoai 喜欢听歌。
它拿到了一个长为𝑛的数列 𝑎1,𝑎2,⋯,𝑎𝑛
​Cidoai 会循环进行以下两种操作，从操作 1 开始：
1. 选择数列中任意多个数 + 1;
2. 选择数列中任意多个数 - 1。

单次操作中必须选择不同位置的数。
它都希望使用最少的操作次数使得整个数列都相等，求最少的操作次数，以及整个数列最后等于的数
可以证明，在最少操作次数的时候，整个数列最后等于的数唯一。

示例1
输入：
8
3 2 4 5 2 3 4 2

输出：
3 4


———————————————————————————————————————————————————————————————————————————————————————
思路分析：

1.分析操作的性质：

我们每次的操作有两种类型：

加1操作：增加某个数的值。
减1操作：减少某个数的值。
这两种操作是交替进行的，并且每次的加1操作和减1操作的选择必须分别选择不同的数位置。
也就是说，最终的目标是将所有数列中的数变成同一个数。


2.确定最终目标数：

首先，考虑数列的最小值 l 和最大值 r，它们定义了一个范围[l, r]。
我们知道，最少操作次数一定是将所有数从这个区间[l, r] 内的值调整到某个目标值，
而这个目标值应该是位于这个区间的中间位置。

---为什么选择中间位置？

操作的性质要求你每次选择不同位置的数进行加减，这就意味着在调整过程中，我们可以看作是两边相向而行。
当我们从最小值 l 和最大值 r 交替向中间值收敛时，每次操作都会让数值更接近最终目标。
因此，最优目标值应该是中间值，即(l + r) / 2，

但是为了最优，取 (l + r + 1) / 2  作为目标数，这一步向上取整非常关键：
实际上就是 (l + r) + 2 - 1 / 2 == (l + r + 1) / 2（通过向上取正推导而来）

<因为 当操作次数为奇数时，最后一次操作一定是将相应序列加一，所以最终目标数会变为区间内的右中间值>



3.操作次数的推导：
由于加1和减1操作是交替进行的，且每次操作要选择不同位置的数，
我们可以把调整数列的过程看作是从[l, r] 区间两端开始，交替向中间移动的过程。

---操作次数的最小值：

最少的操作次数一定是 r − l
因为这相当于 + 1 − 1双向奔赴最终相等，也就是求[l, r) 的区间长度。
——————————————————————————————————————————————————————————————————————————————————————————




知识点总结：
——————————————————————————————————————————————————————————————————————————————————————
知识点1：向上取整的技巧：(这里仅考虑正整数a, b)

方法1：
对于将 a 除以 b 的结果向上舍入：
int result = (a + b - 1) / b;  // 实现向上取整

方法2：判断余数
有余数就加一，没有余数就直接除以b
if (a % b) result = a / b + 1;
else       result = a / b;     // 实现向上取整
——————————————————————————————————————————————————————————————————————————————————————



AC代码：
#include<bits/stdc++.h>

using namespace std;

int main() {
    int n;
    cin >> n;

    vector<long long> num(n, 0);

    for (int i = 0; i < n; i++) 
    {
        cin >> num[i];
    }

    long long max, min;

    max = *max_element(num.begin(), num.end());  // 找到数列中的最大值
    min = *min_element(num.begin(), num.end());  // 找到数列中的最小值

    long long endc = (max - min);  // 计算最少操作次数，即最大值与最小值的差
    long long ends = (max + min + 1) / 2;// 计算最终目标数，应该是右中位数
    
    cout << endc << " " << ends;  // 输出最少操作次数和目标数

    return 0;
}

